]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
panel: Drag topmost maximized window
authorDylan McCall <dylan@dylanmccall.com>
Mon, 5 Feb 2018 18:46:22 +0000 (10:46 -0800)
committerDylan McCall <dylan@dylanmccall.ca>
Sat, 4 May 2019 20:50:04 +0000 (13:50 -0700)
This makes it possible to drag a window which appears connected with the
panel, even if it is not in focus. As a result, it should be easier to
manipulate side-by-side windows.

https://bugzilla.gnome.org/show_bug.cgi?id=679290

js/ui/panel.js

index 7fe09fe50e24670869a2a4d37b5ee154f8aca97a..5d3d779a02e8f3c77bfe73d08bb0633b8582af81 100644 (file)
@@ -971,22 +971,11 @@ class Panel extends St.Widget {
         if (isPress && button != 1)
             return Clutter.EVENT_PROPAGATE;
 
-        let focusWindow = global.display.focus_window;
-        if (!focusWindow)
-            return Clutter.EVENT_PROPAGATE;
-
-        let dragWindow = focusWindow.is_attached_dialog() ? focusWindow.get_transient_for()
-                                                          : focusWindow;
-        if (!dragWindow)
-            return Clutter.EVENT_PROPAGATE;
-
-        let rect = dragWindow.get_frame_rect();
         let [stageX, stageY] = event.get_coords();
 
-        let allowDrag = dragWindow.maximized_vertically &&
-                        stageX > rect.x && stageX < rect.x + rect.width;
+        let dragWindow = this._getDraggableWindowForPosition(stageX);
 
-        if (!allowDrag)
+        if (!dragWindow)
             return Clutter.EVENT_PROPAGATE;
 
         global.display.begin_grab_op(dragWindow,
@@ -1196,4 +1185,21 @@ class Panel extends St.Widget {
                     Main.messageTray.bannerBlocked = isOpen;
             });
     }
+
+    _getDraggableWindowForPosition(stageX) {
+        let workspaceManager = global.workspace_manager;
+        let workspace = workspaceManager.get_active_workspace()
+        let allWindowsByStacking = global.display.sort_windows_by_stacking(
+            workspace.list_windows()
+        ).reverse();
+
+        return allWindowsByStacking.find(metaWindow => {
+            let rect = metaWindow.get_frame_rect();
+            return metaWindow.is_on_primary_monitor() &&
+                   metaWindow.showing_on_its_workspace() &&
+                   metaWindow.get_window_type() != Meta.WindowType.DESKTOP &&
+                   metaWindow.maximized_vertically &&
+                   stageX > rect.x && stageX < rect.x + rect.width
+        });
+    }
 });